/* vcc/vcc.c 
 * 
 * This file is part of vcc. 
 * 
 * vcc is free software: you can redistribute it and/or modify 
 * it under the terms of the GNU General Public License as published by 
 * the Free Software Foundation, either version 3 of the License, or 
 * (at your option) any later version. 
 * 
 * vcc is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
 * GNU General Public License for more details. 
 * 
 * You should have received a copy of the GNU General Public License 
 * along with vcc. If not, see <https://www.gnu.org/licenses/>
 */ 


#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS 1
#endif

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>

#include <sys/stat.h>
#include <sys/types.h>
#include <signal.h>

#include <vcc/vcc.h>
#include <vcc/version.h>
#include <vcc/socket.h>



extern socket_t fd;

int vcc_login_bh(struct vcc_request *);
int do_cmd_ls_bh(struct vcc_request *);


int send_msg(const char *msg, const char *usrname) {
	struct vcc_request req;

	req.magic = htonl(VCC_MAGIC);
	req.reqtype = htonl(REQ_MSG_SEND);
	req.uid = 0;
       
	strcpy(req.usrname, usrname);
	strcpy(req.msg, msg);
	send(fd, &req, REQ_SIZE, 0);

	return 0;
}


int get_msgs(void) {
	struct vcc_request req;

	memset(&req, 0, REQ_SIZE);

	req.magic = htonl(VCC_MAGIC);
	req.reqtype = htonl(REQ_MSG_NEW);
	req.uid = 0;

	send(fd, &req, REQ_SIZE, 0);

	return 0;
}


int read_msg(struct vcc_request *buf) {
	return recv(fd, buf, REQ_SIZE, 0);
}


int get_users(void) {
	struct vcc_request req;

	req.magic = htonl(VCC_MAGIC);
	req.reqtype = htonl(REQ_CTL_USRS);
	req.uid = 0;

	send(fd, &req, REQ_SIZE, 0);

	return 0;
}


int do_bh(struct vcc_request *req) {
	switch (ntohl(req->reqtype)) {
	case REQ_CTL_LOGIN:
		vcc_login_bh(req);

		break;

	case REQ_CTL_USRS:
		do_cmd_ls_bh(req);

		break;

	default:
		fprintf(stderr, "*** unexpected packet. \n");

		break;
	}

	return 0;
}


int vcc_login(char *usrname, char *passwd) {
	struct vcc_request req;

	req.magic = htonl(VCC_MAGIC);
	req.reqtype = htonl(REQ_CTL_LOGIN);

	strcpy(req.usrname, usrname);
	strcpy(req.msg, passwd);

	send(fd, &req, REQ_SIZE, 0);

	return 0;
}


int vcc_login_bh(struct vcc_request *req) {
	if (ntohl(req->reqtype) != REQ_CTL_LOGIN) {
		fprintf(stderr, "*** bad package. \n");

		return 1;
	}

	if (ntohl(req->uid)) 
		printf("ready. \n");

	else {
		fprintf(stderr, "login failed: wrong password or user doesn't exists. \n");
		fprintf(stderr, "if you haven't got an account on this server, ask the administrator" 
				"and you can get one. \n");

		exit(1);
	}

	return 0;
}


